package com.joezj.leetcode.easy;

/**
 * @Author: JoeZj
 * @Description: 整数反转
 * @Date: create in 2020/9/8 22:57
 */
public class ReverseInteger {
    /**
     * 给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。
     *
     * 示例 1:
     *
     * 输入: 123
     * 输出: 321
     *  示例 2:
     *
     * 输入: -123
     * 输出: -321
     * 示例 3:
     *
     * 输入: 120
     * 输出: 21
     * 注意:
     *
     * 假设我们的环境只能存储得下 32 位的有符号整数，则其数值范围为 [−2^31,  2^31 − 1]。请根据这个假设，如果反转后整数溢出那么就返回 0。
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode-cn.com/problems/reverse-integer
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     */
    public static void main(String[] args) {
        ReverseInteger reverse = new ReverseInteger();
        System.out.println(123);
        System.out.println(reverse.reverse(123));
        System.out.println(-123);
        System.out.println(reverse.reverse(-123));
        System.out.println(120);
        System.out.println(reverse.reverse(120));
    }

    static int BASE_NUM = 10;
    static int START_ASCii = 48;

    /**
     * 执行结果：
     * 通过
     * 显示详情
     * 执行用时：
     * 2 ms
     * , 在所有 Java 提交中击败了
     * 35.39%
     * 的用户
     * 内存消耗：
     * 37 MB
     * , 在所有 Java 提交中击败了
     * 66.42%
     * 的用户
     */
    public int reverse(int x) {
        // 用于标记符号位
        boolean positive = x > 0;
        // 保证运算过程中数字为正数
        if(!positive){
            x = - x;
        }
        char[] numChars = String.valueOf(x).toCharArray();
        // char[]存的是各个位数上面的ASCii码值，数字0的ASCii码值为48，因此要取每位上的实际数字应该减去48
        int digit = numChars.length;
        // 使用科学计数法，底数乘以基数的(位数-1)次幂的方式,为了防止越界，使用long存储结果
        long result = 0;
        for(int i = digit - 1; i > -1; i--){
            result = result + (numChars[i] - START_ASCii) * (long)Math.pow(BASE_NUM, i);
        }
        // 至此已经得到结果的实际值，根据符号flag恢复符号位，并判断是否越界，返回结果
        if (!positive){
            result = -result;
        }
        if(result >Integer.MAX_VALUE || result < Integer.MIN_VALUE){
            return 0;
        }
        return (int) result;
    }
    
}
